স্প্রিং বুট ORM (Hibernate/JPA) ব্যবহার করে ডেটাবেসের টেবিলের মধ্যে সম্পর্ক (Relationship) তৈরি করা যায়। JPA অ্যানোটেশন যেমন @OneToOne, @OneToMany, এবং @ManyToMany ব্যবহার করে এই সম্পর্কগুলি সহজেই সংজ্ঞায়িত করা যায়।
One-to-One Mapping
একটি টেবিলের একটি রেকর্ড অন্য একটি টেবিলের কেবল একটি রেকর্ডের সাথে সম্পর্কিত থাকে।
উদাহরণ: একজন ব্যবহারকারীর শুধুমাত্র একটি প্রোফাইল থাকতে পারে।
@OneToOne অ্যানোটেশন ব্যবহারের ধাপ:
Entity ক্লাস উদাহরণ:
import jakarta.persistence.*;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "profile_id", referencedColumnName = "id")
private Profile profile;
// Getters and Setters
}
@Entity
public class Profile {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String bio;
// Getters and Setters
}
বুঝিয়ে বলি:
@OneToOne:UserএবংProfileটেবিলের মধ্যে এক থেকে এক সম্পর্ক স্থাপন করে।@JoinColumn:Userটেবিলেরprofile_idকলামটিকেProfileটেবিলেরidকলামের সাথে ম্যাপ করে।
One-to-Many Mapping
একটি টেবিলের একটি রেকর্ড অন্য একটি টেবিলের একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে।
উদাহরণ: একটি ক্যাটাগরিতে একাধিক পণ্য থাকতে পারে।
@OneToMany অ্যানোটেশন ব্যবহারের ধাপ:
Entity ক্লাস উদাহরণ:
import jakarta.persistence.*;
import java.util.List;
@Entity
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "category", cascade = CascadeType.ALL)
private List<Product> products;
// Getters and Setters
}
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "category_id", referencedColumnName = "id")
private Category category;
// Getters and Setters
}
বুঝিয়ে বলি:
@OneToMany: একটি ক্যাটাগরিতে একাধিক পণ্য সম্পর্কিত।mappedBy:Productটেবিলেরcategoryফিল্ডের মাধ্যমে সম্পর্কটি সংজ্ঞায়িত করে।@ManyToOne:Productটেবিল থেকেCategoryটেবিলের সাথে সম্পর্ক স্থাপন করে।
Many-to-Many Mapping
একটি টেবিলের একাধিক রেকর্ড অন্য একটি টেবিলের একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে।
উদাহরণ: একজন ছাত্র একাধিক কোর্স নিতে পারে এবং একটি কোর্সে একাধিক ছাত্র থাকতে পারে।
@ManyToMany অ্যানোটেশন ব্যবহারের ধাপ:
Entity ক্লাস উদাহরণ:
import jakarta.persistence.*;
import java.util.List;
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id")
)
private List<Course> courses;
// Getters and Setters
}
@Entity
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@ManyToMany(mappedBy = "courses")
private List<Student> students;
// Getters and Setters
}
বুঝিয়ে বলি:
@ManyToMany:StudentএবংCourseটেবিলের মধ্যে একাধিক থেকে একাধিক সম্পর্ক স্থাপন করে।@JoinTable: একটি মধ্যবর্তী টেবিল (student_course) তৈরি করে, যেখানেstudent_idএবংcourse_idসংরক্ষিত থাকে।inverseJoinColumns: বিপরীত সম্পর্কের কলাম সংজ্ঞায়িত করে।
Cascade এবং Fetch টাইপ
- Cascade: ডেটা সঞ্চালনের সময় সম্পর্কিত টেবিলের উপর স্বয়ংক্রিয় অপারেশন করে। উদাহরণ:
CascadeType.ALL,CascadeType.PERSIST,CascadeType.REMOVE। - Fetch Type: ডেটা লোড করার সময় সম্পর্কিত ডেটা কীভাবে ফেচ করা হবে তা নির্ধারণ করে। উদাহরণ:
FetchType.LAZY(ডেটা প্রয়োজন হলে লোড হবে),FetchType.EAGER(প্রথমে সব ডেটা লোড হবে)।
উদাহরণ:
@OneToMany(mappedBy = "category", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Product> products;
সারাংশ
স্প্রিং বুট ORM-এ @OneToOne, @OneToMany, এবং @ManyToMany অ্যানোটেশন ব্যবহার করে ডেটাবেস সম্পর্ক সহজে সংজ্ঞায়িত করা যায়। এই সম্পর্কগুলো ব্যবহারের মাধ্যমে ডেটাবেস অপারেশন যেমন টেবিল ম্যাপিং, ডেটা রিলেশন, এবং CRUD অপারেশন খুবই কার্যকরী ও সহজ হয়।
Read more